home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Browsers, Managers & Extensions / CookieSwap 0.5 / cookieswap-0.5.0-fx.xpi / chrome / chromeFiles / content / cookieProfileContainer.js < prev    next >
Text File  |  2007-07-22  |  15KB  |  338 lines

  1. // *****************************************************************************
  2. // *                    CookieProfileContainer Class                           *
  3. // *                                                                           *
  4. // ************************** Coding Standards *********************************
  5. // *  gMyVariable     - global variable (starts with "g", then mixed case)     *
  6. // *  myVariable      - variables passed into functions                        *
  7. // *  my_variable     - local variable inside of a function                    *
  8. // *  this.myVariable - class attributes/variable (mixed case & always         *
  9. // *                    referenced with "this.")                               *
  10. // *  MyFunction      - functions are always mixed case                        *
  11. // *  MY_CONSTANT     - constants are all caps with underscores                *
  12. // *                                                                           *
  13. // *************************** Revision History ********************************
  14. // *  Name       Date       BugzID  Action                                     *
  15. // *  ---------  ---------  -----   ------                                     *
  16. // *  SteveTine  28Dec2005  12561   Initial Creation                           *
  17. // *  SteveTine  30Sep2006  15281   Dealing with difference in moveTo on Linux *
  18. // *                                                                           *
  19. // ************************* BEGIN LICENSE BLOCK *******************************
  20. // * Version: MPL 1.1                                                          *
  21. // *                                                                           *
  22. // *The contents of this file are subject to the Mozilla Public License Version*
  23. // * 1.1 (the "License"); you may not use this file except in compliance with  *
  24. // * the License. You may obtain a copy of the License at                      *
  25. // * http://www.mozilla.org/MPL/                                               *
  26. // *                                                                           *
  27. // * Software distributed under the License is distributed on an "AS IS" basis,*
  28. // * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License  *
  29. // * for the specific language governing rights and limitations under the      *
  30. // * License.                                                                  *
  31. // *                                                                           *
  32. // * The Original Code is the CookieSwap Mozilla/Firefox Extension             *
  33. // *                                                                           *
  34. // * The Initial Developer of the Original Code is                             *
  35. // * Steven Tine.                                                              *
  36. // * Portions created by the Initial Developer are Copyright (C) 2006          *
  37. // * the Initial Developer. All Rights Reserved.                               *
  38. // *                                                                           *
  39. // * Contributor(s): Steven Tine                                               *
  40. // *                                                                           *
  41. // **************************END LICENSE BLOCK**********************************
  42.  
  43. //Static instance attribute
  44. var gCookieProfileContainer_instance = null;
  45.  
  46. const INVALID_PROFILE_ID=-1;
  47. const COOKIE_SWAP_DIR_NAME="CookieSwap";
  48. const COOKIE_SWAP_DIR_PERMISSIONS = 0700;  //The dir is user r/w/x only
  49.  
  50. const COOKIE_FILE_PREFACE="cookies_";  //All profile files start with this string
  51. const INACT_COOKIE_FILE_EXT="txt";    //Inactive profiles have this file extension
  52. const ACTV_COOKIE_FILE_EXT="tx1";     //Active profiles have this file extension
  53.  
  54. const DEF_PROFILE1_FILENAME = COOKIE_FILE_PREFACE + "Profile1" + "." + ACTV_COOKIE_FILE_EXT;
  55. const DEF_PROFILE2_FILENAME = COOKIE_FILE_PREFACE + "Profile2" + "." + INACT_COOKIE_FILE_EXT;
  56. const DEF_PROFILE3_FILENAME = COOKIE_FILE_PREFACE + "Profile3" + "." + INACT_COOKIE_FILE_EXT;
  57.  
  58. //-------------------CookieProfileContainer class def---------------------
  59. //The CookieProfileContainer class handles keeping track of where all the CookieProfiles
  60. // are stored and determining which profile is active.  
  61. // It also enables the user to add/remove profiles.
  62. //This class is a singleton, so there is only one in existance.  Use the
  63. // CookieProfileContainer_getInstance() to get the instance of the class.
  64. function CookieProfileContainer()
  65. {
  66.    //Define a debug function for the class...change true/false to turn it on/off
  67.    this.classDump=function(s){true ? cookieswap_dbg("[CookieProfileContainer]" + s) : (s)}
  68.  
  69.    //This is the way to call the debug function
  70.    this.classDump("START ctor");
  71.  
  72.    ////--TEMP HARDCODED PROFILES UNTIL PERS STORAGE FIGURED OUT--
  73.    this.profileArray = new Array();
  74.    this.activeProfileId = INVALID_PROFILE_ID;
  75.  
  76.    //This will get the directory of the current Mozilla profile.
  77.    //  We'll put the CookieSwap dir under there since Firefox's cookies.txt file
  78.    //  is stored in this profile dir.
  79.    this.profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
  80.                         .getService(Components.interfaces.nsIProperties)
  81.                         .get("ProfD", Components.interfaces.nsIFile);
  82.    this.profileDir.append(COOKIE_SWAP_DIR_NAME);
  83.  
  84.    //If the CookieSwap directory doesn't exist, this is the first time that
  85.    //  the CookieSwap extension has run.  Create the directory and also
  86.    //  create the default profile files.
  87.    if( (this.profileDir.exists() != true) || (this.profileDir.isDirectory() != true) ) 
  88.    { 
  89.       this.classDump("First time CookieSwap has been run...creating " + COOKIE_SWAP_DIR_NAME);
  90.  
  91.       //Create the directory
  92.       this.profileDir.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, COOKIE_SWAP_DIR_PERMISSIONS);
  93.  
  94.       //Make a few copies of the directory handle
  95.       var def_profile1 = this.profileDir.clone()
  96.       var def_profile2 = this.profileDir.clone()
  97.       var def_profile3 = this.profileDir.clone()
  98.  
  99.       //Append the filenames to the directory
  100.       def_profile1.append(DEF_PROFILE1_FILENAME);
  101.       def_profile2.append(DEF_PROFILE2_FILENAME);
  102.       def_profile3.append(DEF_PROFILE3_FILENAME);
  103.  
  104.       //Now create the default files
  105.       def_profile1.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, COOKIE_FILE_PERMISSIONS);
  106.       def_profile2.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, COOKIE_FILE_PERMISSIONS);
  107.       def_profile3.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, COOKIE_FILE_PERMISSIONS);
  108.    }
  109.  
  110.    //Let's enumerate through all the files in the CookieSwap directory
  111.    var files = this.profileDir.directoryEntries;
  112.    var i=0;
  113.  
  114.    this.classDump("Recursing the profileDir..." + files.hasMoreElements());
  115.  
  116.    while (files.hasMoreElements())
  117.    {
  118.       //Get the next file an QI to a nsIFile object
  119.       var curr_file = files.getNext();
  120.       curr_file.QueryInterface(Components.interfaces.nsIFile);
  121.  
  122.       //Convert to convient String
  123.       var file_name  = new String(curr_file.leafName);
  124.       this.classDump("--File located...Name=" + file_name);
  125.  
  126.       //Now split off the preface of the filename used for cookie files
  127.       var fname_split = file_name.split(COOKIE_FILE_PREFACE);
  128.       this.classDump("Num of split is " + fname_split.length);
  129.     
  130.       //If the split found the preface, then the file is likely a cookie file
  131.       if (fname_split.length > 1)
  132.       {
  133.          //Now split off the extension so we can get the extension and the profile name
  134.          //  If we find more than that, the file is not valid...likely a swap file
  135.          //  left around when someone edited the valid cookie file
  136.          var  profile_name = fname_split[1].split(".");
  137.  
  138.          //At this point, profile_name[0]=ProfileName, profile_name[1]=file extension
  139.          //  if there are more than 2 elements in the split then we don't have the
  140.          //  above scenario...not valid
  141.          if(profile_name.length == 2)
  142.          {
  143.             this.classDump("Profile #" + i + " : Name=" + profile_name[0] + ", ext=" + profile_name[1]);
  144.  
  145.             //We have a valid cookie profile file...create the CookieProfile object
  146.             this.profileArray[i] = new Object();
  147.             this.profileArray[i].profile = new CookieProfile(curr_file);
  148.             this.profileArray[i].name = profile_name[0];
  149.  
  150.             //If the file extension shows it as active, track it
  151.             if (profile_name[1] == ACTV_COOKIE_FILE_EXT)
  152.             {
  153.                this.classDump("Profile #" + i + " is active");
  154.                this.activeProfileId = i;
  155.             }
  156.  
  157.             //Increment the valid profile counter
  158.             i++;
  159.          }
  160.       }
  161.  
  162.    }
  163.        
  164.    //This is the way to call the debug function
  165.    this.classDump("END ctor");
  166. }
  167.  
  168. //This "static" method returns the singleton instance of this class
  169. function CookieProfileContainer_getInstance()
  170. {
  171.    if (gCookieProfileContainer_instance == null)
  172.    {
  173.       //If this is the first time this method is being called, create the singleton
  174.       //  instance of the class and return it.
  175.       gCookieProfileContainer_instance = new CookieProfileContainer();
  176.    }
  177.  
  178.    return gCookieProfileContainer_instance;
  179. }
  180.  
  181. //This method returns the number of profiles that exist in this container.
  182. CookieProfileContainer.prototype.getNumOfProfiles = function()
  183. {
  184.    return(this.profileArray.length); 
  185. }
  186.  
  187. //This method returns a string that is the name of the profileID passed in.
  188. //  null is returned if the profileID is invalid.
  189. CookieProfileContainer.prototype.getProfileName = function(profileId)
  190. {
  191.    if (profileId < this.profileArray.length)
  192.    {
  193.       return(this.profileArray[profileId].name);
  194.    }
  195.    else
  196.    {
  197.       this.classDump("Invalid ID (" + profileId + ") passed in to getProfileName of " + this.profileArray.length);
  198.       return(null);
  199.    }
  200. }
  201.  
  202. //This method returns a CookieProfile class object corresponding to the profileID
  203. //  passed in.  If not profile with that profileID exists, null is returned.
  204. CookieProfileContainer.prototype.getProfile = function(profileId)
  205. {
  206.    if (profileId < this.profileArray.length)
  207.    {
  208.       return(this.profileArray[profileId].profile);
  209.    }
  210.    else
  211.    {
  212.       this.classDump("Invalid ID (" + profileId + ") passed in to getProfile of " + this.profileArray.length);
  213.       return(null);
  214.    }
  215. }
  216.  
  217. //This method adds the passed in CookieProfile object passed in to the containder.
  218. //  The profile ID is returned.
  219. CookieProfileContainer.prototype.addProfile = function(profileName)
  220. {
  221.    this.classDump("--UNIMPLEMENTED METHOD---- addProfile()");//Still need to perform file operations
  222.    //The next availabe index in the array is the length
  223.    //var next_index = this.profileArray.length;
  224.  
  225.    return(INVALID_PROFILE_ID);
  226. }
  227.  
  228. CookieProfileContainer.prototype.removeProfile = function(profileId)
  229. {
  230.    this.classDump("--UNIMPLEMENTED METHOD---- removeProfile()");//Still need to perform file operations
  231.    if (profileId < this.profileArray.length)
  232.    {
  233.       var i;
  234.       var array_len = this.profileArray.length;
  235.       //In order to keep the profiles in numerical order, remove the profile
  236.       //  and shift all the other profiles up.
  237.       //[TODO] Not sure if this is the right thing to do because other classes
  238.       //  may have references to the old profileIDs....
  239.       for(i=profileId; i<(profile_len - 1); i++)
  240.       {
  241.          //One by one shift up the profiles in the array
  242.          this.profileArray[i].profile = this.profileArray[i+1].profile;
  243.          this.profileArray[i].name = this.profileArray[i+1].name;
  244.       }
  245.  
  246.       //Now null out the last entry in the array
  247.       this.profileArray[i].profile = null;
  248.       this.profileArray[i].name = null;
  249.  
  250.       if (profileId < this.activeId)
  251.       {
  252.          //All profileID above the profileId passed in have been
  253.          //  shifted down by one.  If the activeProfileId was shifted
  254.          //  the adjust it down.
  255.          this.activeProfileId--;
  256.       }
  257.    }
  258.    else
  259.    {
  260.       this.classDump("Invalid ID passed in to getProfile");
  261.    }
  262.  
  263.    return(this.profileArray.length);
  264. }
  265.  
  266. //Returns the profileID of the active profile
  267. CookieProfileContainer.prototype.getActiveProfileId = function()
  268. {
  269.    return(this.activeProfileId);
  270. }
  271.  
  272. //Changes the active profile to the profileID pased in.  The active profileID
  273. //  is returned.  If it doesn't match the profileId passed in, then it was
  274. //  not accepted as a valid profile to make active.
  275. CookieProfileContainer.prototype.setActiveProfileId = function(profileId)
  276. {
  277.    this.classDump("START setActiveProfileId( " + profileId + ")");
  278.  
  279.    //If the currently active profile is valid, rename that profile's filename to indicate
  280.    //  that is no longer the active profile
  281.    if ((this.activeProfileId != INVALID_PROFILE_ID)  && (this.activeProfileId < this.profileArray.length))
  282.    {
  283.       var i = this.activeProfileId;
  284.       var fileHandle = this.profileArray[i].profile.getFileHandle();
  285.  
  286.       //Renaming to inactive filename
  287.       this.classDump("Renaming " + this.profileArray[i].name + " (old profile)");
  288.       this.profileArray[i].profile.setFileHandle(this.moveFile(fileHandle, COOKIE_FILE_PREFACE + this.profileArray[i].name + "." + INACT_COOKIE_FILE_EXT));
  289.    }
  290.  
  291.    //If the new profileID is valid, rename that profile's file to indicate that it
  292.    //  is the active profile
  293.    if ((profileId != INVALID_PROFILE_ID)  && (profileId < this.profileArray.length))
  294.    {
  295.       var i = profileId;  //Rename profileId to a shorter var
  296.       var fileHandle = this.profileArray[i].profile.getFileHandle();
  297.          
  298.       //Renaming to active filename
  299.       this.classDump("Renaming " + this.profileArray[i].name + " (new profile)");
  300.       this.profileArray[i].profile.setFileHandle(this.moveFile(fileHandle, COOKIE_FILE_PREFACE + this.profileArray[i].name + "." + ACTV_COOKIE_FILE_EXT));
  301.    }
  302.    else
  303.    {
  304.       this.classDump("Invalid ID passed in to setActiveProfileId");
  305.       profileId = INVALID_PROFILE_ID;  //Non-valid ID passed in, make it INVALID
  306.    }
  307.       
  308.    this.activeProfileId = profileId;
  309.    this.classDump("END setActiveProfileId( " + profileId + ")");
  310.    
  311.    return(this.activeProfileId);
  312. }
  313.  
  314. CookieProfileContainer.prototype.moveFile = function(fileHandle, newFileName)
  315. {
  316.    this.classDump("---move start (from '" + fileHandle.leafName + "' to '" +  newFileName + "')---");
  317.  
  318.    //Actually rename the file to the new name
  319.    fileHandle.moveTo(null, newFileName);
  320.  
  321.    //On certain OSs (i.e. Linux), the call to moveTo does not update the fileHandle to point
  322.    //  to the new file.  In that case, update it manually
  323.    if (fileHandle.leafName != newFileName)
  324.    {
  325.       //Replace the existing filename portion of the path with the new filename portion of the path
  326.       newFilePath = fileHandle.path.replace(fileHandle.leafName, newFileName);
  327.  
  328.       this.classDump("Needing to update fileHandle on this OS from '" + fileHandle.path + "' to '" + newFilePath);
  329.  
  330.       //Create a new nsIFile object and point it to the new file
  331.       fileHandle = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  332.       fileHandle.initWithPath(newFilePath);
  333.    }
  334.  
  335.    this.classDump("---move end---");
  336.    return(fileHandle);
  337. }
  338.